home *** CD-ROM | disk | FTP | other *** search
- /* DAL handling routines */
-
- #include <string.h>
- #include "DatabaseAccess.h"
- #include "DalDemo.h"
-
- extern Rect gOutRect;
- extern CharsHandle gInText;
- long sessionId;
- long gTimer;
- long gCounter;
- int gDALState;
- Boolean gDALActive, gDALMonitor, gDALNewCodeFrag;
-
- /***Utility routines originally included to keep dependencies down on external
- object libraries***/
-
- /***StrLen***/
- int StrLen(s)
- char *s;
- {
- int n;
-
- for (n = 0; *s != '\0'; s++) n++;
- return n;
- }
-
- /***StrToOut***/
- void StrToOut(demoWind,str)
- demoPeek demoWind;
- char *str;
- {
- long len;
-
- if ((len = (long) StrLen(str)) != 0)
- {
- TESetSelect(32767,32767,demoWind->outputTE);
- TEInsert(str,len,demoWind->outputTE);
- }
- }
-
- /***IntToOut***/
- void IntToOut(demoWind,num)
- demoPeek demoWind;
- int num;
- {
- int i,j,c,sign;
- char str[24];
-
- if ((sign = num) < 0)
- num = -num;
- i = 0;
- do {
- str[i++] = num % 10 + '0';
- } while ((num /= 10) > 0);
- if (sign < 0)
- str[i++] = '-';
- str[i] = '\0';
- for (i = 0, j = StrLen(str); i < j; i++, j--)
- c = str[i], str[i] = str[j-1], str[j-1] = c;
- StrToOut(demoWind,str);
- }
-
- /***NLToOut***/
- void NLToOut(demoWind)
- demoPeek demoWind;
- {
- TEKey(TE_CARRIAGE_RETURN,demoWind->outputTE);
- }
-
- /**Provide 'english' meaning to numeric messages ***/
- void DALTransErr(demoWind,err)
- demoPeek demoWind;
- int err;
- {
- switch (err)
- {
- case noErr: StrToOut(demoWind,"OK/VAL ");
- break;
- case rcDBNull: StrToOut(demoWind,"NULL ");
- break;
- case rcDBError: StrToOut(demoWind,"ERROR ");
- break;
- case rcDBValue: StrToOut(demoWind,"READY ");
- break;
- case rcDBBadType: StrToOut(demoWind,"BADTYPE ");
- break;
- case rcDBBreak: StrToOut(demoWind,"BREAK ");
- break;
- case rcDBExec: StrToOut(demoWind,"EXEC ");
- break;
- default:
- StrToOut(demoWind,"unknown error: ");
- IntToOut(demoWind,err);
- }
- }
-
- /***Create the session link with the server ***/
- void DALOpenLink(demoWind,node,user,pass)
- demoPeek demoWind;
- Str255 node, user, pass;
- {
- int err;
- Str63 ddevName = "DAL\0";
- Str255 connStr = "";
-
- CtoPstr((char *)ddevName);
- sessionId = -1L;
-
- err = DBInit(&sessionId, ddevName, node,user,pass,connStr,0L);
- if (err != noErr)
- DALErrorHandler(demoWind,err);
- else
- {
- gDALActive = TRUE;
- StrToOut(demoWind,"OpenLink:Connection established");
- NLToOut(demoWind);
- }
- }
-
- /***DALSendExecute sends arbitrary fragment from input buffer and requests
- execution by the server if transmission was successful***/
-
- void DALSendExecute(demoWind)
- demoPeek demoWind;
- {
- short len;
- int err;
- TEPtr te;
-
- te = *(demoWind->curTE);
- if ((len = te->teLength) == 0) return;
-
- SwitchToNewArea(demoWind);
- NLToOut(demoWind);
- StrToOut(demoWind,"<Sending and Executing>");
- NLToOut(demoWind);
- TEPaste(demoWind->curTE);
- NLToOut(demoWind);
- AdjustScrollBar(demoWind);
- SwitchToNewArea(demoWind);
- gDALNewCodeFrag = TRUE;
-
- HLock((Handle)gInText);
- err = DBSend(sessionId,**gInText,len,NIL);
- HUnlock((Handle)gInText);
- if (err != noErr)
- DALErrorHandler(demoWind,err);
- else
- {
- err = DBExec(sessionId,NIL);
- if (err != noErr)
- DALErrorHandler(demoWind,err);
- }
- }
-
- /***DALMonitorState does just that on a periodic basis***/
- void DALMonitorState(demoWind)
- demoPeek demoWind;
- {
- int err;
- long ticks;
-
- if ((ticks = TickCount()) >= gTimer)
- {
- gTimer += DAL_MONITOR_INTERVAL;
- ++gCounter;
- err = DBState(sessionId,NIL);
- if (err == rcDBError && gDALNewCodeFrag)
- DALErrorHandler(demoWind,err);
- /***new on 6/4 ****/
- gDALState = err;
- if (gDALMonitor) DALDisplayState(demoWind);
- if (gDALState == rcDBValue && gDALNewCodeFrag) DALReadLink(demoWind);
- }
- }
-
- /***DALErrorHandler***/
- void DALErrorHandler(demoWind,err)
- demoPeek demoWind;
- int err;
- {
- long errp;
- long err2p;
- Str255 itm1;
- Str255 itm2;
- Str255 msg;
-
- gDALState = DBGetErr(sessionId, &errp, &err2p, itm1, itm2, msg,NIL);
- NLToOut(demoWind);
- DALTransErr(demoWind,err);
- StrToOut(demoWind,msg);
- NLToOut(demoWind);
- gDALNewCodeFrag = FALSE;
- }
-
- /***DALDisplayState***/
- void DALDisplayState(demoWind)
- demoPeek demoWind;
- {
- DALTransErr(demoWind,gDALState);
- }
-
- /***DALCloseSession provides a clean shutdown***/
- void DALCloseLink(demoWind)
- demoPeek demoWind;
- {
- int err;
-
- err = DBEnd(sessionId,NIL);
- if (err != noErr)
- DALErrorHandler(demoWind,err);
- else
- gDALActive = FALSE;
- }
-
- /***DALReadLink is an overly complex procedure to get data from the server***/
- void DALReadLink(demoWind)
- demoPeek demoWind;
- {
- DBType typep;
- short lenp;
- short placep;
- short flagsp;
- Ptr buffer[DAL_MAXCOL];
- int err;
- short maxCol;
- short bIndex;
- Boolean firstRow;
-
- /* do informational wait loop checking for data */
-
- firstRow = TRUE;
- bIndex = 0;
- maxCol = 0;
- buffer[bIndex] = (Ptr) NIL;
-
- /* double check that data is ready by using read-only mode of GetItem */
- typep = typeAnyType;
- err = DBGetItem(sessionId, DAL_MONITOR_INTERVAL/4, &typep, &lenp, &placep, &flagsp,
- NIL,NIL);
- if (err < rcDBValue) return;
-
- StrToOut(demoWind,"<Reading Program Output>");
- NLToOut(demoWind);
-
- while (err != rcDBError && err == rcDBValue)
- {
- typep = typeAnyType;
- err = DBGetItem(sessionId, kDBWaitForever, &typep, &lenp, &placep, &flagsp,
- NIL,NIL);
- if (err != rcDBValue) break;
- /* if this is the first row, set up buffer space for each column's data */
- if (firstRow)
- {
- switch (typep)
- {
- case typeVChar:
- case typeChar:
- lenp += 1; /* add one for null character termination */
- break;
- default:
- lenp = 8;
- break;
- }
- if ((buffer[bIndex] = NewPtr(lenp)) == NIL) ErrorHandler(NO_MEMORY);
- /* check to see if this is the last colitem in this row...
- last time to grab pointers for this data request */
- firstRow = !(flagsp & kDBLastColFlag);
- }
- else
- {
- switch (typep)
- {
- case typeVChar:
- case typeChar:
- DisposPtr(buffer[bIndex]);
- lenp += 1; /* add one for null character termination */
- if ((buffer[bIndex] = NewPtr(lenp)) == NIL) ErrorHandler(NO_MEMORY);
- break;
- default:
- break;
- }
- } /*else*/
- if (bIndex > maxCol) maxCol = bIndex;
- err = DBGetItem(sessionId, kDBWaitForever, &typep, &lenp, &placep, &flagsp,
- buffer[bIndex],NIL);
- if (err != rcDBValue && err != rcDBNull) break;
- if (flagsp & kDBLastColFlag)
- {
- DALDisplayRow(demoWind,buffer,bIndex);
- bIndex = 0;
- }
- else
- ++bIndex;
- } /*while*/
- /* free up memory */
- bIndex = 0;
- while (maxCol-- >= 0)
- DisposPtr(buffer[bIndex++]);
- NLToOut(demoWind);
-
- } /*DALReadLink*/
-
- /***DALDisplayRow***/
- void DALDisplayRow(demoWind,buffer,bufLen)
- demoPeek demoWind;
- Ptr *buffer;
- int bufLen;
- {
- int i;
-
- for (i = 0; i <= bufLen; i++)
- {
- StrToOut(demoWind,(char *) buffer[i]);
- StrToOut(demoWind," ");
- }
-
- NLToOut(demoWind);
- }